C# EntityFramework存在多个问题
我在后端使用实体框架,在前端使用jqGrid。我的网格如下所示: 如果我使用这些过滤器中的一个,我的网格工作得很好。 例如: 使用过滤器:“Erfasser” 使用过滤器:“土地” 两个过滤器都工作得很好,但我有以下共同的结果: 我对这个问题一无所知。这是我的密码:C# EntityFramework存在多个问题,c#,entity-framework,jqgrid,C#,Entity Framework,Jqgrid,我在后端使用实体框架,在前端使用jqGrid。我的网格如下所示: 如果我使用这些过滤器中的一个,我的网格工作得很好。 例如: 使用过滤器:“Erfasser” 使用过滤器:“土地” 两个过滤器都工作得很好,但我有以下共同的结果: 我对这个问题一无所知。这是我的密码: using (var db = new ProconContext()) { // Paging für die Liste erstellen, da zuviele Datensätze,
using (var db = new ProconContext())
{
// Paging für die Liste erstellen, da zuviele Datensätze, user sollte selber über die
// größe der Seite bestimmen können.
var query = db.Belege.Join(db.Kunden, x => x.KundenNr, y => y.KundeId, (x, y) => new { Beleg = x, Kunde = y })
.Select(x => new BelegKunden { Beleg = x.Beleg, Kunde = x.Kunde });
db.Configuration.AutoDetectChangesEnabled = false;
query = query.Where(x => x.Beleg.BelegTypId == belegArtNr);
foreach (var param in parameters)
{
if (param.Key.Equals("BelegId"))
{
var belegId = Convert.ToInt32(param.Value);
query = query.Where(x => x.Beleg.BelegId == belegId);
}
if (param.Key == "Name")
{
query = query.Where(x => x.Kunde.Name.Contains(param.Value));
}
if (param.Key.Equals("Datum"))
{
query = query.Where(x => x.Datum.Equals(param.Value));
}
if (param.Key.Equals("KundenNr"))
{
var kundenNr = Convert.ToInt32(param.Value);
query = query.Where(x => x.Beleg.KundenNr == kundenNr);
}
if (param.Key.Equals("Land"))
{
query = query.Where(x => x.Kunde.Land.ZweiBuchstabenIsoCode.Contains(param.Value));
}
if (param.Key.Equals("PLZ"))
{
query = query.Where(x => x.Kunde.Plz.Contains(param.Value));
}
if (param.Key.Equals("Ort"))
{
query = query.Where(x => x.Kunde.Ort.Contains(param.Value));
}
if (param.Key.Equals("Erfasser"))
{
query = query.Where(x => x.Beleg.ErfasstVonUsername.Contains(param.Value));
}
if (param.Key.Equals("Kommission"))
{
query = query.Where(x => x.Beleg.KopfKommission.Contains(param.Value));
}
if (param.Key.Equals("ErstePosition"))
{
query = query.Where(x => x.Beleg.ErsteRechnungsPosition.Contains(param.Value));
}
}
var count = query.Count();
var list = query.OrderByDescending(x => x.Beleg.BelegDatum)
.Skip(skip) // Wie viele soll er überspringen (die ersten x)
.Take(take) // Wie viele soll er von da aus nehmen (nimm x)
.ToList();
list[0].AllRowsCount = count;
return AppServerHelper.AppResponse(list);
}
}
catch (Exception e)
{
return AppServerHelper.AppResponse(new List<BelegKunden>());
}
为了安全起见,我删除了配置数据中的“columnnames”,很抱歉 我想我明白了你的问题,当你加入时,你以错误的方式创建了匿名类型,请这样做:
var query = db.Beleg.Join(
db.Kunden,
x => new { x.KundenNr }, //the outer selector, the foreing key to Kunden
y => new { y.KundeId }, //the inner selector, the primary key in Kunde, this will match x.KundenNr == y.KundenId
(x,y) => new { BelegNr = x.BelegId , BelegDatum = x.BelegDatum, Name = y.Name .....}); //here you select the columns(fields) in each table, and construct the new anonymous object with the fields that you need in each table
这里有一些链接可以帮助您更好地理解
我正在分析,在您的情况下,您不需要联接,联接用于选择要联接的每个表的几个字段,但这里您保留了两个entires表。我的建议是使用简单where子句
希望能有所帮助。首先:感谢emcas88为您提供的时间和帮助 我用你的想法解决了问题: 仅选择字段和:
var query = db.Beleg.Join(
db.Kunden,
x => new { x.KundenNr }, //the outer selector, the foreing key to Kunden
y => new { y.KundeId }, //the inner selector, the primary key in Kunde, this will match x.KundenNr == y.KundenId
(x,y) => new { BelegNr = x.BelegId , BelegDatum = x.BelegDatum, Name = y.Name .....}); //here you select the columns(fields) in each table, and construct the new anonymous object with the fields that you need in each table
另一个问题是:
我需要改变这一点:
foreach (var param in parameters)
{
if (param.Key.Equals("BelegId"))
{
var belegId = Convert.ToInt32(param.Value);
query = query.Where(x => x.Beleg.BelegId == belegId);
}
if (param.Key == "Name")
{
query = query.Where(x => x.Kunde.Name.Contains(param.Value));
}
if (param.Key.Equals("Datum"))
{
query = query.Where(x => x.Datum.Equals(param.Value));
}
if (param.Key.Equals("KundenNr"))
{
var kundenNr = Convert.ToInt32(param.Value);
query = query.Where(x => x.Beleg.KundenNr == kundenNr);
}
if (param.Key.Equals("Land"))
{
query = query.Where(x => x.Kunde.Land.ZweiBuchstabenIsoCode.Contains(param.Value));
}
if (param.Key.Equals("PLZ"))
{
query = query.Where(x => x.Kunde.Plz.Contains(param.Value));
}
if (param.Key.Equals("Ort"))
{
query = query.Where(x => x.Kunde.Ort.Contains(param.Value));
}
if (param.Key.Equals("Erfasser"))
{
query = query.Where(x => x.Beleg.ErfasstVonUsername.Contains(param.Value));
}
if (param.Key.Equals("Kommission"))
{
query = query.Where(x => x.Beleg.KopfKommission.Contains(param.Value));
}
if (param.Key.Equals("ErstePosition"))
{
query = query.Where(x => x.Beleg.ErsteRechnungsPosition.Contains(param.Value));
}
}
为此:
if (parameters.ContainsKey("BelegId"))
{
var belegId = Convert.ToInt32(parameters["BelegId"]);
query = query.Where(x => x.BelegId == belegId);
}
if (parameters.ContainsKey("Name"))
{
var tmp = parameters["Name"];
query = query.Where(x => x.Name.Contains(tmp));
}
if (parameters.ContainsKey("Datum"))
{
var tmp = parameters["Name"];
query = query.Where(x => x.BelegDatum.Equals(tmp));
}
if (parameters.ContainsKey("KundenNr"))
{
var kundenNr = Convert.ToInt32(parameters["KundenNr"]);
query = query.Where(x => x.KundenNr == kundenNr);
}
if (parameters.ContainsKey("Land"))
{
var tmp = parameters["Land"];
query = query.Where(x => x.Land.ZweiBuchstabenIsoCode.Contains(tmp));
}
if (parameters.ContainsKey("PLZ"))
{
var tmp = parameters["PLZ"];
query = query.Where(x => x.Plz.Contains(tmp));
}
if (parameters.ContainsKey("Ort"))
{
var tmp = parameters["Ort"];
query = query.Where(x => x.Ort.Contains(tmp));
}
if (parameters.ContainsKey("Erfasser"))
{
var tmp = parameters["Erfasser"];
query = query.Where(x => x.ErfasstVonUsername.Contains(tmp));
}
if (parameters.ContainsKey("Kommission"))
{
var tmp = parameters["Kommission"];
query = query.Where(x => x.KopfKommission.Contains(tmp));
}
if (parameters.ContainsKey("ErstePosition"))
{
var tmp = parameters["ErstePosition"];
query = query.Where(x => x.ErsteRechnungsPosition.Contains(tmp));
}
我想问题在于foreach循环。
循环将执行两次查询,在第二个代码块中,查询将在函数末尾执行。您好,请尝试不使用联接。不使用联接可以正常工作,但我需要“Kunde”提供的一些信息。如果可以的话,请发布模型以了解更多信息,但我相信问题在于你的加入。我会尽快发布模型。这有点奇怪,但是:如果我在我的SQL视图上创建一个“SQL视图”,并选择带有where的视图,我会遇到同样的问题。KundenNr==KundenId是Kunden表的主键吗?
var query = db.Beleg.Join(
db.Kunden,
x => new { x.KundenNr }, //the outer selector, the foreing key to Kunden
y => new { y.KundeId }, //the inner selector, the primary key in Kunde, this will match x.KundenNr == y.KundenId
(x,y) => new { BelegNr = x.BelegId , BelegDatum = x.BelegDatum, Name = y.Name .....}); //here you select the columns(fields) in each table, and construct the new anonymous object with the fields that you need in each table
foreach (var param in parameters)
{
if (param.Key.Equals("BelegId"))
{
var belegId = Convert.ToInt32(param.Value);
query = query.Where(x => x.Beleg.BelegId == belegId);
}
if (param.Key == "Name")
{
query = query.Where(x => x.Kunde.Name.Contains(param.Value));
}
if (param.Key.Equals("Datum"))
{
query = query.Where(x => x.Datum.Equals(param.Value));
}
if (param.Key.Equals("KundenNr"))
{
var kundenNr = Convert.ToInt32(param.Value);
query = query.Where(x => x.Beleg.KundenNr == kundenNr);
}
if (param.Key.Equals("Land"))
{
query = query.Where(x => x.Kunde.Land.ZweiBuchstabenIsoCode.Contains(param.Value));
}
if (param.Key.Equals("PLZ"))
{
query = query.Where(x => x.Kunde.Plz.Contains(param.Value));
}
if (param.Key.Equals("Ort"))
{
query = query.Where(x => x.Kunde.Ort.Contains(param.Value));
}
if (param.Key.Equals("Erfasser"))
{
query = query.Where(x => x.Beleg.ErfasstVonUsername.Contains(param.Value));
}
if (param.Key.Equals("Kommission"))
{
query = query.Where(x => x.Beleg.KopfKommission.Contains(param.Value));
}
if (param.Key.Equals("ErstePosition"))
{
query = query.Where(x => x.Beleg.ErsteRechnungsPosition.Contains(param.Value));
}
}
if (parameters.ContainsKey("BelegId"))
{
var belegId = Convert.ToInt32(parameters["BelegId"]);
query = query.Where(x => x.BelegId == belegId);
}
if (parameters.ContainsKey("Name"))
{
var tmp = parameters["Name"];
query = query.Where(x => x.Name.Contains(tmp));
}
if (parameters.ContainsKey("Datum"))
{
var tmp = parameters["Name"];
query = query.Where(x => x.BelegDatum.Equals(tmp));
}
if (parameters.ContainsKey("KundenNr"))
{
var kundenNr = Convert.ToInt32(parameters["KundenNr"]);
query = query.Where(x => x.KundenNr == kundenNr);
}
if (parameters.ContainsKey("Land"))
{
var tmp = parameters["Land"];
query = query.Where(x => x.Land.ZweiBuchstabenIsoCode.Contains(tmp));
}
if (parameters.ContainsKey("PLZ"))
{
var tmp = parameters["PLZ"];
query = query.Where(x => x.Plz.Contains(tmp));
}
if (parameters.ContainsKey("Ort"))
{
var tmp = parameters["Ort"];
query = query.Where(x => x.Ort.Contains(tmp));
}
if (parameters.ContainsKey("Erfasser"))
{
var tmp = parameters["Erfasser"];
query = query.Where(x => x.ErfasstVonUsername.Contains(tmp));
}
if (parameters.ContainsKey("Kommission"))
{
var tmp = parameters["Kommission"];
query = query.Where(x => x.KopfKommission.Contains(tmp));
}
if (parameters.ContainsKey("ErstePosition"))
{
var tmp = parameters["ErstePosition"];
query = query.Where(x => x.ErsteRechnungsPosition.Contains(tmp));
}