GVKun编程网logo

c# – 在Linq到实体中组合谓词

14

如果您对c#–在Linq到实体中组合谓词感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于c#–在Linq到实体中组合谓词的详细内容,并且为您提供关于.net–Linq到Sql

如果您对c# – 在Linq到实体中组合谓词感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于c# – 在Linq到实体中组合谓词的详细内容,并且为您提供关于.net – Linq到Sql很多加入表、.net – 数据绑定到LINQ到实体时的重复行、asp.net – 如何删除linq到sql?、asp.net-mvc – EntityFunctions.CreateDateTime问题与linq到实体的闰年的有价值信息。

本文目录一览:

c# – 在Linq到实体中组合谓词

c# – 在Linq到实体中组合谓词

我想动态构建我的条件列表.这是我的代码片段:

protected Expression<Func<event_info,bool>> _wherePredicate = c => true;

public void main() 
{

 _wherePredicate = _wherePredicate.And(c => c.createdby == 6);
 _wherePredicate = _wherePredicate.And(c => c.isdeleted == 0);

 var query = from ev in dataConnection.event_info
                       where ev.isdeleted == 0
                       select ev;
 Results = query.Where(_wherePredicate).ToList(); 
}

除非这不起作用,因为linq-to-entities不支持Invoke方法.

我可以在linq-to-entities中组合谓词的好方法是什么?

解决方法

事实证明,你需要添加这个:

结果= query.AsExpandable.Where(_wherePredicate).ToList();

然后它就神奇地起作用了!

我按照本教程:
http://www.albahari.com/nutshell/predicatebuilder.aspx

.net – Linq到Sql很多加入表

.net – Linq到Sql很多加入表

我是一个有经验的Rails开发人员,我以为我会尝试ASP.NET的MVC版本.在这样做的时候,我也决定试试 Linq-> sql …

我对Linq-> sql处理连接的方式感到有些困惑.

我的模式的一个简单的例子是:

图书:
ID
标题

类别:
ID
名称

books_categories:
book_id
CATEGORY_ID

只需将这些表拖动到.dbml文件就好像不行.我在Book类book_categories上获得一个属性,我期望的是一个可以迭代并直接获取Category类的属性.

现在我必须做一些非常错误的事情

foreach (books_categories bc in book.books_categories)
        {
            category_names.Add(bc.Category.category.Trim());
        }

[回应接受答复]
我勉强接受“写你自己的胶水代码”的答案.在继续研究Linq-> sql之后,我发现显然缓慢地放弃了(更为强大的IMO)实体框架. EF仍然允许一个人使用LINQ查询,并做出一个体面的工作,找出像Ruby的ActiveRecord之类的关系.

解决方法

使用Book的部分类实现,并为类别及其属性添加适当的方法.具有属性前端的Books_Categories属性(您可以使其具有私有的可见性,以强制实现通过您的Categories属性).
public partial class Books
{
    public IEnumerable<string> CategoryNames
    {
       get
       {  
            return this.Books_Categories
                       .Select( bc => bc.Category.category.Trim() );
       }
    }

    public void AddCategory( Category category )
    {
       this.Books_Categories.Add( new Book_Category
                                  {
                                      Category = category,Book = this
                                  } );
    }

    public void RemoveCategory( Category category )
    {
       var bc = this.Book_Categories
                    .Where( c => c.Category == category )
                    .SingleOrDefault();
       this.Books_Categories.Remove( bc );
    }
}

显然,你需要添加一些错误/边界检查等,但是你会得到这个想法.

我会给你这不是理想的,但至少你有灵活性来确定它是如何工作的.

.net – 数据绑定到LINQ到实体时的重复行

.net – 数据绑定到LINQ到实体时的重复行

我有问题绑定一个telerik RadGrid和一个简单的vanilla ASP.NET GridView到以下LINQ到实体查询的结果.在这两种情况下,网格都包含正确的行数,但是所有其他行中仅复制第一行的数据.我直接从这个代码中分配返回值,即网格上的DataSource属性.
public IEnumerable<DirectoryPersonEntry> FindPersons(string searchTerm)
{
    DirectoryEntities dents = new DirectoryEntities();
    return from dp in dents.DirectoryPersonEntrySet
           where dp.LastName.StartsWith(searchTerm) || dp.Extension.StartsWith(searchTerm)
           orderby dp.LastName,dp.Extension
           select dp;
}

ADDED:这是替代的纯ADO.NET代码,其工作原理是:

DataTable ret = new DataTable();
    using (sqlConnection sqn = new sqlConnection(ConfigurationManager.ConnectionStrings["WaveAdo"].ConnectionString))
    {
        sqlDataAdapter adap = new sqlDataAdapter("select * from DirectoryPersonList where LastName like '" + searchTerm + "%' order by LastName ",sqn);
        sqn.open();
        adap.Fill(ret);
    }
    return ret;

更多:

>通过LINQ工作发送到sql Server的查询.
>迭代LINQ查询结果返回结果之前,返回相同的重复.
>迭代LINQ结果调用方法,绑定之前,导致相同的重复.

更新:
基于marc Gravel以下非常合乎逻辑和适当的建议,我发现EF设计师对我的实体类实体关键字做了一个非常未受过教育的猜测,它是其列表中仅有的第一个领域所有其他记录共有七个条目.

这确实是重复的原因.如果只有我可以更改或删除实体密钥,但是这个具有Etch-a-Sketch的所有业务逻辑的EF设计师都非常钦佩重复它的延迟选择,同时嘲笑我锁定外面乞求改变密钥.

解决方法

它看起来像我有一个borked主键. LINQ-to-sql和EF的“身份管理”方面意味着,只要它看到相同的对象类型的主键值,它就不得不给同一个实例.

例如,给出数据:

id     | name       | ...
-------+------------+------
1      | Fred       | ...
2      | Barney     | ...
1      | Wilma      | ...
1      | Betty      | ...

那么如果它认为id是从LINQ迭代对象时的主键,它被迫给你“Fred”,“Barney”,“Fred”,“Fred”.从本质上讲,当它再次看到id 1时,它甚至没有看到其他列 – 它只是从标识缓存中读取ID为1的实例,并为您提供与之前相同的Fred实例.如果不认为id是主键,它会将每一行视为一个单独的对象(如果在其中一个字段中具有与另一个记录相同的值,那么这不是完全不寻常的).

我建议检查您标记为主键(在您的DBML / EDM模型中)的任何字段在每行中是否唯一.在上述情况下,id列显然不表示唯一标识符,因此不适合作为主键.在LINQ-to-sql / EF设计器中,只需取消标记.

更新:特别是在设计器中查看各种属性的“实体密钥”属性 – 特别是在查询视图时.检查“实体密钥”是否只适用于合适的列(即使行唯一的列).如果设置不正确,请将其设置为false.这也是黄色键图标可见 – 这应该只出现在真正是记录的唯一标识符的东西上.

asp.net – 如何删除linq到sql?

asp.net – 如何删除linq到sql?

我非常新的 linq到sql,我不知道如何实际删除一个记录.

所以我一直在看这个教程

http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part-1.aspx

所以对于更新他们有

northwindDataContext db = new northwindDataContext();

Product product = db.Products.Single(p => p.ProductName == "Toy 1");

product.UnitPrice == 99;
product.UnitsInStock = 5;

db.SubmitChanges();

删除他们有

northwindDataContext db = new northwindDataContext();

var toyProducts = from p in db.Producsts
              where p.ProductName.Contains("Toy")
                  select p;

db.Products.RemoveAll(toyProducts);

db.SubmitChanges();

所以我每次都要查询,以获取记录,以便删除该记录?像我可以看到这样做与更新,因为你需要给它一个记录先更新,然后进行更改,所以我了解查询部分,但不是删除.

喜欢你不能发送你想要删除的东西,它会删除它吗?你为什么要先得到它,然后告诉它被删除?

数据库上没有2个命中?

还有我正在努力工作的外交关系.所以我有这个

public ViewResult(string param1,string param2)
{
   Table A = new Table A
   A.Field1 = param1;
   A.Field2 = param2;

   Delete(A);
}

private void Delete(Table A)
{
   DbContext.A.DeleteallOnsubmit(A.TableB);
   DbContext.A.DeleteallOnSubmit(A.TableC);
   DbContext.A.DeleteOnSubmit(A);

}

所以这个失败就出现了这样的消息:“无法删除未附加的实体”.

所以我可以看到为什么前两行在delete方法中失败,因为我创建了一个新对象,而且它们在对象中没有任何有关TableB和TableC的信息.

然而,我看不出为什么最后一行仍然失败,即使不在那里的另外两条线.

就像我以为它会工作的一样,它将需要我的Table A类对象,我传入并查看表中包含的信息.这似乎并非如此.

那么我首先要把信息拿出来,然后做一个查询来得到它,然后删除它,就像在例子中一样?

removeAll()和DeleteallOnSubmit()之间的区别也是如此.

就像我说的,我是linq到sql的新手,由于时间限制,还没有能够坐下来读一本书.一旦我有更多的时间,我将会阅读一本书.

谢谢

解决方法

您有一个问题有几个问题,但是如果您已经拥有主键,我将从最简单的关于附件开始.如果你没有主键,那么我一直只是做一个提取,然后删除,但是,每当我做一个提取,我倾向于存储更新和删除的主键.

它将删除主键,但是如果你有这样的话,那么只需像下面的那样添加,然后调用delete.我不会传递DLINQ所需的对象,因为我想要更改它,如果我想要的,所以我传递一个不同的用户对象,只是从业务类拉扯PK并将其放入DAO类.

var db = new MeatRequestDataContext();            
if (input.UserID > 0)
{
     entity = new User()
     {
         UserID = input.UserID
     };
     db.Users.Attach(entity);
     db.Users.DeleteOnSubmit(entity);
 }

asp.net-mvc – EntityFunctions.CreateDateTime问题与linq到实体的闰年

asp.net-mvc – EntityFunctions.CreateDateTime问题与linq到实体的闰年

当我的数据库中有闰年时(例如:2012年2月29日). EntityFunctions.CreateDateTime函数抛出System.Data.sqlClient.sqlException:从字符串转换日期和/或时间时转换失败.

我的代码在我的asp.net mvc(C#)应用程序中如下:

from u in _entities.tt_Users
let _start_date = u.Start_Date
let _startDate = _start_date.Day
let _startmonth = _start_date.Month
let _startyear = _start_date.Year
let _starthour = u.Start_Time.Value.Hours
let _startminutes = u.Start_Time.Value.Minutes
let _startseconds = u.Start_Time.Value.Seconds
let _startDateWithTime = EntityFunctions.CreateDateTime(_startyear,_startmonth,_startDate,_starthour,_startminutes,_startseconds)
let _startDateWithZeroTime = EntityFunctions.CreateDateTime(_startyear,0)
let _start_datetime = u.Is_Include_Time ? _startDateWithZeroTime : _startDateWithTime
let _end_date = u.End_Date
let _endDate = _end_date.Day
let _endmonth = _end_date.Month
let _endyear = _end_date.Year
let _endhour = u.End_Time.Value.Hours
let _endminutes = u.End_Time.Value.Minutes
let _endseconds = u.End_Time.Value.Seconds
let _endDateWithTime = EntityFunctions.CreateDateTime(_endyear,_endmonth,_endDate,_endhour,_endminutes,_endseconds)
let _endDateWithZeroTime = EntityFunctions.CreateDateTime(_endyear,0)
let _end_datetime = u.Is_Include_Time ? _endDateWithZeroTime : _endDateWithTime
let _cur_Start_date = u.Is_Include_Time ? _userStartDate : _gMTStartDate
let _cur_End_date = u.Is_Include_Time ? _userEndDate : _gMTEndDate
where u.User_Id == 1 && !u.Is_Deleted
&& _start_datetime >= _cur_Start_date && _end_datetime <= _cur_End_date
select new
{
  u.User_id,u.User_Name,u.Login_Name,u.Email_Address
};

这里_userStartDate,_userEndDate,_gMTStartDate和_gMTEndDate是我函数的参数.

如果列“Is_Include_Time”为true,那么我还必须从表中包含TimeSpan.但是对于闰年它抛出的错误.

有什么建议?

解决方法

我刚遇到同样的问题.我在数据库行中有一些值,我需要转换为日期时间.我发现我可以使用以下构造:

DateTime startDate = new DateTime(1,1,1);
            var counters = from counter in entities.Counter
                           let date = sqlFunctions.DateAdd("day",counter.DayOfMonth-1,sqlFunctions.DateAdd("month",counter.Month-1,sqlFunctions.DateAdd("year",counter.Year-1,startDate)))
                           where date >= dateFrom && date <= dateto
                           orderby date
                           select new
                           {
                               Value = counter.CounterValue,Date = date
                           };

我不确定性能影响,但确实有效.

最好的祝福,托尔 – 奇

我们今天的关于c# – 在Linq到实体中组合谓词的分享已经告一段落,感谢您的关注,如果您想了解更多关于.net – Linq到Sql很多加入表、.net – 数据绑定到LINQ到实体时的重复行、asp.net – 如何删除linq到sql?、asp.net-mvc – EntityFunctions.CreateDateTime问题与linq到实体的闰年的相关信息,请在本站查询。

本文标签: