Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取修改对象的LINQ表达式_C#_Linq_Lambda - Fatal编程技术网

C# 获取修改对象的LINQ表达式

C# 获取修改对象的LINQ表达式,c#,linq,lambda,C#,Linq,Lambda,我有一个地址列表,而地址定义如下: public class Address { public int Id { get; set; } public string Name { get; set; } public DateTime ModifiedDate { get; set; } } 基于之前的调用,我有一个元组列表,而元组由地址id和修改日期组成 e.g. List<Tuple<int, DateTime>> 不幸的是,以下是不可能的

我有一个地址列表,而地址定义如下:

public class Address
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime ModifiedDate { get; set; }
}
基于之前的调用,我有一个元组列表,而元组由地址id和修改日期组成

e.g. List<Tuple<int, DateTime>>
不幸的是,以下是不可能的:

异常:“LINQ to Entities无法识别方法'System.DateTime get_Item(Int32)'方法,此方法无法转换为存储表达式。”

addressList.Where(a=>Id.Contains(a.Id)&&dates[a.Id]
这个问题可以通过循环解决,但我正在寻找一个更优雅的解决方案

List<Address> modifiedAddressList = new List<Address>();
foreach (Address a in addressList)
{
    if (a.ModifiedDate > dates[a.Id]) modifiedAddressList.Add(a);
}
List modifiedDressList=new List();
foreach(地址列表中的地址a)
{
如果(a.ModifiedDate>dates[a.Id])modifiedDressList。添加(a);
}

这里的问题是,LinqToEntities不了解您的字典,以及如何将其转换为数据库查询

您有几个选择:

  • 在每个项目上循环(如您所建议的)
  • 传入已修改记录的ID
  • 将整个数据集下载到客户端(使用ToList()),然后使用字典方法
  • 选项#3非常简单-如果您不处理大型数据集:

    addressList
        .Where(a => ids.Contains(a.Id))
        .AsEnumerable()
        .Where(dates[a.Id] < a.ModifiedDate);
    
    地址列表
    .其中(a=>ids.Contains(a.Id))
    .可计算的()
    .其中(日期[a.Id]
    这里的问题是,LinqToEntities不了解您的字典,以及如何将其转换为数据库查询

    您有几个选择:

  • 在每个项目上循环(如您所建议的)
  • 传入已修改记录的ID
  • 将整个数据集下载到客户端(使用ToList()),然后使用字典方法
  • 选项#3非常简单-如果您不处理大型数据集:

    addressList
        .Where(a => ids.Contains(a.Id))
        .AsEnumerable()
        .Where(dates[a.Id] < a.ModifiedDate);
    
    地址列表
    .其中(a=>ids.Contains(a.Id))
    .可计算的()
    .其中(日期[a.Id]
    目前,您的应用程序中有一个包含一些信息的字典,数据库中有一些当前日期。为了比较这两个数据集,需要将两者放在同一位置。这意味着要么将字典中的信息转移到数据库中,要么在进行比较之前将数据库中的数据返回到应用程序中

    如果要将数据发送到数据库,需要通过SQL完成;您的数据库不能只运行任何旧的C#代码,这正是您试图做的,也是它无法工作的原因

    “更简单”的解决方案可能是做您似乎不太喜欢的事情,即从数据库中提取数据,然后在应用程序中对其进行过滤。另一种选择是将字典中的数据上传到临时表,然后将两个表连接在一起

    如果您愿意,您可以用LINQ esk的方式执行第一个选项:

    addressList.Where(a => ids.Contains(a.Id))
        .AsEnumerable()
        .Where(a => dates[a.Id] < a.ModifiedDate);
    
    addressList.Where(a=>ids.Contains(a.Id))
    .可计算的()
    其中(a=>dates[a.Id]

    AsEnumerable
    调用将确保后续方法在应用程序中执行,而不是转换为SQL。
    Contains
    检查可以转换为SQL中的IN子句,因此它应该在
    AsEnumerable
    调用之前,这样它就在DB端完成了。

    目前,您的应用程序中有一个包含一些信息的字典,数据库中有一些当前日期。为了比较这两个数据集,需要将两者放在同一位置。这意味着要么将字典中的信息转移到数据库中,要么在进行比较之前将数据库中的数据返回到应用程序中

    如果要将数据发送到数据库,需要通过SQL完成;您的数据库不能只运行任何旧的C#代码,这正是您试图做的,也是它无法工作的原因

    “更简单”的解决方案可能是做您似乎不太喜欢的事情,即从数据库中提取数据,然后在应用程序中对其进行过滤。另一种选择是将字典中的数据上传到临时表,然后将两个表连接在一起

    如果您愿意,您可以用LINQ esk的方式执行第一个选项:

    addressList.Where(a => ids.Contains(a.Id))
        .AsEnumerable()
        .Where(a => dates[a.Id] < a.ModifiedDate);
    
    addressList.Where(a=>ids.Contains(a.Id))
    .可计算的()
    其中(a=>dates[a.Id]

    AsEnumerable
    调用将确保后续方法在应用程序中执行,而不是转换为SQL。
    Contains
    检查可以转换为SQL中的IN子句,因此它应该在
    AsEnumerable
    调用之前,因此它在DB端完成。

    LINQ to Entities无法识别该方法。。。哪种方法?您忘记了在每个方法的末尾使用.ToList()Where@lazyberezovsky我想那是他的错误,是索引器日期[a.Id]
    @KingKing-yep,我也是。但他对异常最重要的部分置之不理:)@lazyberezovsky,底层方法是
    get_Item(Int32)
    ,就是这样:)LINQ-to-Entities不识别该方法。。。哪种方法?您忘记了在每个方法的末尾使用.ToList()Where@lazyberezovsky我想那是他的错误,是索引器日期[a.Id]
    @KingKing-yep,我也是。但他对异常最重要的部分置之不理:)@lazyberezovsky,底层方法是
    get_Item(Int32)
    ,就是这样:)很好的答案我真的很感激!你知道contains方法是否有一个极限吗?@Moo我相信有几千项。实际上,通常首先命中的是DB的限制。大多数数据库不支持包含超过2-5000项的IN子句。如果你超过了这个极限,你又会遇到同样的问题;您可以在应用程序中同时执行这两项操作(即将
    AsEnumerable
    向上移动)或将该信息上载到临时表。回答得好,我非常感谢!你知道有没有限制吗
    addressList.Where(a => ids.Contains(a.Id))
        .AsEnumerable()
        .Where(a => dates[a.Id] < a.ModifiedDate);