LINQ lambda表达式中的条件

时间:2016-06-29 05:16:37

标签: c# .net entity-framework linq linq-to-entities

我是使用 lambda表达式的LINQ查询表达式的新手。我有一种方法可以更新不同表中的值。 它在单个或默认情况下工作正常,但在使用Where条件时则不行。

SqlConnection con = new SqlConnection();
con.ConnectionString = "Server=localhost;Database=myDatabase;User Id=sa;Password = Password; ";

foreach (Object item in checkedListBox1.CheckedItems)
{
    try
    {
      using (StreamReader reader = File.OpenText(checkedListBox1.Items))
      {
        string s = "";
        while ((s = reader.ReadToEnd()) != null)
        {                               
           SqlCommand sql = new SqlCommand(s, con);
        }
      }
    }
    catch (Exception Ex)
    {
      MessageBox.Show(Ex.Message);
    }

    con.Open();                 
}
  

错误:无法隐式转换类型   'System.Linq.IQueryable'来   'Database.UserOfferUsed'。存在显式转换(是你   错过演员?)

2 个答案:

答案 0 :(得分:4)

.Where会在此处返回IQueryable,使用.SingleOrDefault.FirstOrDefault来获取结果(如果所需结果只是一个项目)。或者如果结果包含多个元素,则可以使用.ToList()。如果是这样,您必须将objUserUsed更改为List<UserOfferUsed>即,您的代码将是这样的:

UserOfferUsed objUserUsed = objEntity.UserOfferUseds.FirstOrDefault(TBL => TBL.UserID == UserID);

或者喜欢这个

List<UserOfferUsed> objUserUsed = objEntity.UserOfferUseds.Where(TBL => TBL.UserID == UserID).ToList();

您可以根据您的要求选择以上其中一种;

更新:如果UserID对于列表中的每个元素都是唯一的,那么.FirstOrDefault()将是最佳选择,因为查询不会给出多个结果(您还必须考虑null,因为如果找不到指定的匹配项,FirstOrDefault()将给出null。如果您使用列表并且想要更新这些值意味着您可以执行以下操作:

foreach(var objUserUsed in objEntity.UserOfferUseds.Where(TBL => TBL.UserID == UserID))
{
   objUserUsed.UsedCoupon = 0;
}

答案 1 :(得分:1)

linq语句作用于可枚举的序列。这意味着你可以说:给我第一个。并且:我有这个,给我下一个。

大多数linq运算符返回IEnumerable&lt; T>,意思是,它返回另一个序列。在执行类似foreach之类的操作之前或直到执行不返回IEnumerable&lt;的linq语句之前,不会枚举序列。 T>但是一个T

换句话说:只要您的语句返回序列,代码就不会被真正枚举。

如果查看SingleOrDefault,您将看到返回值为T.要计算返回值,请枚举序列。

Enumerable.Where的返回值不是T,而是IEnumerable&lt; T>。编译器这么说。

要获得与第一个语句相同的结果,您需要无参数的SingleOrDefault:

IEnumerable<UserOfferUsed> mySequence = objEntity.UserOfferUseds
    .Where(TBL => TBL.UserID == UserID);
UserOfferUsed objUserUsed = mySequence.SingleOrDefault();

或者如果你想在一个声明中这样做:

UserOfferUsed objUserUsed = objEntity.UserOfferUseds
    .Where(TBL => TBL.UserID == UserID)
    .SingleOrDefault();

如果查找First / Single / Any / All等函数,Linq函数不返回序列而是序列的一个元素,您将找到带参数和无参数版本的版本。带参数的函数与使用参数后跟无参数函数的Where具有相同的效果:

var result = SomeSequence.Last( x => SomeFunction(x))

返回序列中的相同项目:

var result = SomeSequence.Where( x => SomeFunction(x)).Last();