使用LINQ或EF执行查询以从多个表中获取记录

时间:2017-10-03 00:50:37

标签: c# asp.net-mvc entity-framework linq

我一直在寻找一段时间。但所有的解决方案似乎与我的期望不同。

所以这是我在SQL中的查询: -

Select * from
(
    select Name,Description Descr from CourseTbl
    union all
    select MainDesc Name,MainDesc Descr from CoursedescTbl
    union all
    select SubHeading Name,SubDesc Descr from CourseSubDesc
    union all
    select Name,Descr as Descr from InternTbl
)A where A.Name like '%D%' or A.Descr like '%D%'

我想使用LINQ或EF执行上述查询。并以Json格式返回列表。所以我尝试了许多失败的尝试,这是其中之一: -

public JsonResult SearchDetail()
    {
        string SearchKey = Request.Form["SearchName"].ToString();

        IEnumerable<SearchList> QueryResult;

        using (EBContext db = new EBContext())
        {
            try
            {
                QueryResult = 
                    (from x in db.Courses 
                     select new { A = x.Name, B = x.Description })
                    .Concat(from y in db.CourseDesc 
                            select new { A = y.MainHeading, B = y.MainDesc })
                    .Concat(from z in db.CourseSubDesc 
                            select new { A = z.SubDesc, B = z.SubHeading })
                    .Concat(from w in db.Interns 
                            select new { A = w.Name, B = w.Descr })
                    .ToList();                    
            }
            catch (Exception ex)
            {
                return new JsonResult 
                {
                    Data = ex.Message, 
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet 
                };
            }



            return new JsonResult 
            { 
                Data = QueryResult, 
                JsonRequestBehavior = JsonRequestBehavior.AllowGet 
            };
        }

    }

我的SearchList类是这样的: -

public class SearchList
{
    public string Name { get; set; }
    public string Descr { get; set; }
}
  1. 我无法将where子句放在linq查询中,这将在所有表中进行搜索。
  2. 当我将queryresult分配给我的ef查询时,我收到错误。它说无法施放到无数。
  3. 先谢谢。

3 个答案:

答案 0 :(得分:1)

你能解释一下你得到的错误吗?

另外,您是否尝试在linq中使用.Union()

QueryResult = db.Courses.Select(x=> new { A = x.Name, B= x.Description})
             .Union(db.CourseDesc.Select(y=> new {A = y.MainHeading, B = y.MainDesc })
             .Union( //so on 
             .ToList(); //this isn't necessary 

编辑:有两种方法可以输入where子句,每次搜索或最后:

 QueryResult = db.Courses.Where(x=>x.Name == "Name").Select(x=> new { A = x.Name, B= x.Description})
             .Union(db.CourseDesc.Where(y=>y.MainHeading == "Name").Select(y=> new {A = y.MainHeading, B = y.MainDesc })
             .Union( //so on 
             .ToList(); 

或者:

  QueryResult = db.Courses.Where(x=>x.Name == "Name").Select(x=> new { A = x.Name, B= x.Description})
             .Union(db.CourseDesc.Where(y=>y.MainHeading == "Name").Select(y=> new {A = y.MainHeading, B = y.MainDesc })
             .Union( //so on 
             //Where can go either before or after .ToList
             .Where(item=>item.A == "Name")
             .ToList();

答案 1 :(得分:0)

你没有说出你得到的错误/异常。但是,您的QueryResult类型为IEnumerable<SearchList>,并且您似乎正在为其分配一个匿名类型{ A, B }的可枚举。

试试这个:

QueryResult = (from x in db.Courses 
                 select new SearchList { Name = x.Name, Descr = x.Description })
                 .Concat(...)
                 .ToList();

QueryResult = db.Courses.Select(x => new SearchList 
                 { Name = x.Name, Descr = x.Description})
                .Concat(...)
                .ToList();

<强>更新

如果您将我的选择更改为new SearchList,而不是new匿名类型,那么您的#2问题将会得到解决。

至于您的问题#1,您应该在Where()之前插入Select()

result1 = db.Courses
                .Where(x => x.Name.Contains('D') || x.Description.Contains('D'))
                .Select(x => new SearchList { Name = x.Name, Descr = x.Description});
result2 = db.CourseDesc
                .Where(y => y.MainHeading.Contains('D') || y.MainDesc.Contains('D'))
                .Select(y => new SearchList { Name = y.MainHeading, Descr = y.MainDesc});
result3 = db.CourseSubDesc
                .Where(...)
                .Select(...);

QueryResult = result1.Concat(result2).Concat(result3).ToList();

在每个表上执行Where()作为查询的一部分很重要,因此您不会从该表中获取所有记录,这与Where()之后的Concat()不同。另请注意,Concat()可能会引发ArgumentNullException

答案 2 :(得分:0)

单独列出并查询和连接 查看此示例

>>> img = np.array([[150, 0], [255, 150]], dtype=np.float32)
>>> noise = np.array([[20, -20], [20, -20]], dtype=np.float32)
>>> noisy_img = img+noise
>>> noisy_img
array([[ 170.,  -20.],
       [ 275.,  130.]], dtype=float32)
>>> noisy_img[noisy_img>255] = 255
>>> noisy_img[noisy_img<0] = 0
>>> noisy_img = np.uint8(noisy_img)
>>> noisy_img
array([[170,   0],
       [255, 130]], dtype=uint8)