У меня проблема, которая сводит меня с ума с MVC, C# и Fluent NHibernate (ASP.Net 4.5).Fluent NHibernate: передача параметров пользовательскому методу
У меня есть вызов FNH «GetSession(). Query() ....», который в свою очередь вызывает простой статический метод «VitCommon.ChooseLanguage», передающий параметр «язык» по содержанию. Странно то, что «язык» содержит «ita» непосредственно перед вызовом, в то время как в момент ввода ChooseLanguage он изменен на другое значение.
Глядя на стек вызовов, я вижу, что ничего не было вызвано, кроме пучка методов FNH и ChooseLanguage.
Я уже пробовал эти:
- использовал локальную переменную в методе: вар _language = язык;
- использует локальную переменную с String.Copy(): var _language = String.Copy (язык);
- сделал ChooseLanguage не статическую
- переключатель заявление, которое не устанавливает _language с литералов
Ничего они работали. Это часть кода.
public List<Allegato> GetAllegatiBySchedaPk(Vit.TipoScheda tipoScheda, int pkScheda, string tipoMediaSupportati = "", string language = "ita")
{
tipoMediaSupportati = tipoMediaSupportati + "";
var arTipoMediaSupportati = tipoMediaSupportati.Split(new string[] { "||" }, StringSplitOptions.RemoveEmptyEntries);
var listTassonoimieImmagini = arTipoMediaSupportati.Select(s => new TassonomiaMultimedia {
ID = Convert.ToInt32(s.Split(';')[0]),
Descrizione = s.Split(';')[1]
}).ToList();
var val = GetSession().Query<TabcMultimedia>()
.Join(GetSession().Query<Immagini>(), l => l.fk_immagine, r => r.pk_immagine, (l, r) => new { Multimedia = l, Immagini = r })
.Where(w => w.Multimedia.fk_schedatipo == (int)tipoScheda && w.Multimedia.fk_chiavescheda == pkScheda && w.Immagini.fk_tipo_immagini == 4)
.OrderBy(o => o.Multimedia.ordine)
.Select(s => new Allegato {
IdAllegato = s.Immagini.pk_immagine,
Titolo = s.Multimedia.denom_ita != null ? VitCommon.ChooseLanguage(s.Multimedia, "denom", language) : VitCommon.ChooseLanguage(s.Immagini, "titolo", language),
Didascalia = s.Multimedia.didasca_ita != null ? VitCommon.ChooseLanguage(s.Multimedia, "didasca", language) : VitCommon.ChooseLanguage(s.Immagini, "descrizione", language),
Tassonomia = GetTassonomiaMultimedia(s.Multimedia.est_inv, listTassonoimieImmagini),
Tipo = s.Immagini.immagine_tipo
})
.ToList();
return val;
}
public static string ChooseLanguage(object oggettoCorrente, string FieldName, string LinguaVitCorrente, bool underscorePresent) {
var underscore = "_";
if (!underscorePresent) {
underscore = "";
}
var retString = "";
var processLang = LinguaVitCorrente;
var lingue = LingueVit.GetLingue().Where(l => l.Suffisso.Equals(processLang)).SingleOrDefault();
var i = 0;
while (retString == "") {
try {
retString =
(oggettoCorrente.GetType().GetProperty(FieldName + underscore + processLang).GetValue(oggettoCorrente, null) + "");
}
catch {
retString = "Proprietà non trovata ('" + FieldName + underscore + processLang +
"')! il nome della proprietà è case sensitive e per ciascuna tipologia di campo deve essere unfirome, controllare nel mapping dell'oggetto.";
}
if (retString == "") {
try {
processLang = lingue.Alternative[i].Suffisso;
}
catch {
retString = "not found";
}
i++;
}
}
var returnVal = retString == "not found" ? "" : retString;
return returnVal;
}
Методом проб и ошибок было установлено, что этот способ работает:
var listaAllegati = GetSession().Query<TabcMultimedia>()
.Join(GetSession().Query<Immagini>(), l => l.fk_immagine, r => r.pk_immagine, (l, r) => new { Multimedia = l, Immagini = r })
.Where(w => w.Multimedia.fk_schedatipo == (int)tipoScheda && w.Multimedia.fk_chiavescheda == pkScheda && w.Immagini.fk_tipo_immagini == 4)
.OrderBy(o => o.Multimedia.ordine)
.ToList();
var listaAllegatiLingua = listaAllegati.Select(s => new Allegato {
IdAllegato = s.Immagini.pk_immagine,
Titolo = s.Multimedia.denom_ita != null ? VitCommon.ChooseLanguage(s.Multimedia, "denom", language) : VitCommon.ChooseLanguage(s.Immagini, "titolo", language),
Didascalia = s.Multimedia.didasca_ita != null ? VitCommon.ChooseLanguage(s.Multimedia, "didasca", language) : VitCommon.ChooseLanguage(s.Immagini, "descrizione", language),
Tassonomia = GetTassonomiaMultimedia(s.Multimedia.est_inv, listTassonoimieImmagini),
Tipo = s.Immagini.immagine_tipo
})
.ToList();
return listaAllegatiLingua;
Даже поставив вар _language = «ита» работает, конечно, это делает весь метод бесполезен.
Похоже, что некоторые многопоточности в FNH являются виновниками, но мне трудно представить, что и как, может кто-нибудь мне поможет?
Заранее спасибо.
Спасибо FIRO, это оказалось лучшим решением, поскольку это не только исправили проблему (он «зависает» сгенерированный SQL, не так последующая обработка больше не портит параметр), но и получает лучшую производительность , Обратите внимание, что позиция, в которой помещается предложение .AsEnumerable, чувствительна к результату. Еще раз спасибо. – lfassio