我很新的MVC世界,但我一直在做asp.net多年。我用mvc开始这个项目,所以我可以习惯它。我一直在挣扎一些过于复杂的SQL语句LINQ已经产生,我认为我做错了什么。也许它正确地做到这一点,我只是不能从头开始写SQL语句。复杂的MVC LINQ生成的SQL脚本
好的,我的目标是获得这个身份数据库,我已经添加了几个字段,并链接到其他一些表中,如地址和phoneNumbers等。
我正在供应商搜索屏幕上工作,并希望使用LINQ来获取数据。在下面的例子中,一些信息在table1的下拉列表中,并且具有文本搜索选项,允许在主aspnet用户和一些其他表格上的多个字段上“或”搜索。
我希望有人帮我在linq上获得这个简化版本。或者我应该开始写我的SQL和使用,在这里以某种方式(不知道怎么做,在MVC框架,而应该是相当类似的
var VendorRole = await db.Roles.FirstAsync(r => r.Name == "vendor");
var results = db.Users.Include(u => u.table1).
Include(u => u.table2).Include(u => u.table3).
Include(u => u.table4).Include(u => u.table5).
Where(u => u.Roles.Any(s => s.RoleId == VendorRole.Id));
if (id1.HasValue)
{
results.Where(m => m.table1.First(a => a.id1 == id1) != null);
}
if (id2.HasValue)
{
results.Where(m => m.table1.First(a => a.id2 == id2) != null);
}
if (id3.HasValue)
{
results.Where(m => m.table1.First(a => a.id3 == id3) != null);
}
IEnumerable<string> searchTerms = SearchString.Split(' ')
.Select(x => x.Trim());
foreach (string term in searchTerms)
{
if (!string.IsNullOrWhiteSpace(term))
{
string captured = term.ToUpper();
results = results.Where(t => (t.field1.ToUpper().Contains(captured) ||
t.field2.ToUpper().Contains(captured) ||
t.field3.ToUpper().Contains(captured) ||
(t.field2 + " " + t.field3).ToUpper().Contains(captured) ||
t.field4.ToUpper().Contains(captured) ||
t.field5.ToUpper().Contains(captured) ||
t.table2.Any(m => (m.field6 + " " + m.field7).ToUpper().Contains(captured)) != null));
}
}
ViewBag.count = results.Count();
if ((page -1) * 10 > ViewBag.count)
{
page = (int)Math.Floor((double)ViewBag.count/10);
}
ViewBag.page = page;
return PartialView(await results.OrderBy(m => m.field1 + " " + m.field2 + " " + m.field3).Skip((page - 1) * 10).Take(10).ToListAsync());
感谢您花时间帮助。
有多个'Where'子句相当于'AND'操作而不是'OR'。你真的想在_all_条件下使用'OR'吗? – RePierre