我遇到这个linq有问题

时间:2015-11-12 18:21:07

标签: c# linq

我需要获取一些数据并在其他级别使用它。我不能回来(c),我正在寻找一种模式。我怎样才能正确归还?

public string AutoUpdate(string _search)
{
    using (var context = new Phone_BookEntities1())
    {
        var c = from d in context.Cantacts
                where d.Cantact1 == _search
                select d.Cantact1.ToString();
        return c;
    }
}

2 个答案:

答案 0 :(得分:8)

问题是您的查询正在返回IEnumerable<T>,其中TCantact1的类型,但由于您要将其转换为字符串,因此它将返回IEnumerable<string>。但由于返回类型为string,您需要返回单个项目。您可以使用FirstOrDefault: -

 var c = (from d in context.Cantacts
          where d.Cantact1 == _search
          select d.Cantact1.ToString()).FirstOrDefault();

或使用Lambda语法: -

var c = context.Cantacts.FirstOrDefault(d => d.Cantact1 == _search);
if(c != null)
   return c.Cantact1.ToString();
else
   return String.Empty;  //any default value

答案 1 :(得分:0)

我想重申Rahul的解决方案,并对Lambda解决方案进行一些扩展。

以下演示了Lambda表达式的声明和用法。

首先,确保您拥有这些名称空间:

using System;
using System.Linq;
using System.Linq.Expressions;

然后

public string AutoUpdate(string _search)
{

    Expression<Func<Cantact, bool>> WhereClause = (d) => d.Cantact1 == _search;
    // thats: System.Linq.Expressions.Expression<System.Func<Cantact, bool>>

    return FirstContact(WhereClause);
    // or
    //return FirstContact((d) => d.Cantact1 == _search));
}

public string FirstContact(Expression<Func<Cantact, bool>> WhereClause) 
{
    using (var context = new Phone_BookEntities1()) 
    {
        //var query = context.Cantacts.FirstOrDefault(WhereClause);
        var query = context.Cantacts.Where(WhereClause).FirstOrDefault();            
        return (query == null) ? String.Empty : query.Cantact1;
    }
}

如果_search staticconstant我们不需要在函数范围内声明WhereClause

正如您在代码片段中看到的那样,我们将第一次接触的功能移到了它自己的功能中,AutoUpdate只是构建表达式并传递它。

注意:

您将返回query.Cantact1,这将是_search ..您应该考虑返回Model.Cantact实体,或者AutoUpdate是否应该更新实体在某些时候,按照查询命令分离(QCS)模式/职责,返回bool或只生成方法void